 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biblioteca.dao.iClassesDAO.jogo;
using Biblioteca.classesBasicas.jogo;
using Biblioteca.util;
using System.Data.SqlClient;

namespace Biblioteca.dao.classesDAO.jogo
{
    class ReservaDAO : Conexao, IReservaDAO
    {
        public void cadastrar(Reserva objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comandoSql = conexao.CreateCommand();
                comandoSql.CommandText = "INSERT INTO RESERVA(DATA, HORARIO, DURACAO, QUANTIDADE_JOGADORES, ID_CAMPO) VALUES ('" + objeto.Data + "','" + objeto.Horario + "','" + objeto.Duracao + "','" + objeto.QuantidadeJogadores +"'," + Convert.ToInt32(objeto.Campo.Id) + ")";
                comandoSql.ExecuteNonQuery();
                comandoSql.Dispose();
                this.fecharConexao();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao cadastar Reserva.");
            }
            finally
            {
                this.fecharConexao();
            }
        }

        public void alterar(Reserva objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("UPDATE RESERVA SET DATA='" + objeto.Data + "', HORARIO='" + objeto.Horario + "', DURACAO='" + objeto.Duracao + "', QUANTIDADE_JOGADORES='" + objeto.QuantidadeJogadores + "'" + " WHERE RESERVA.ID_RESERVA = " + Convert.ToInt32(objeto.Id), this.conexao);
                comando.ExecuteNonQuery();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao alterar Reserva.");
            }
            finally
            {
                this.fecharConexao();
            }
        }

        public void remover(Reserva objeto)
        {
            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("EXEC PROCEDURE_DELETAR_RESERVA " + Convert.ToInt32(objeto.Id), this.conexao);
                comando.ExecuteNonQuery();
                comando.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao remover Reserva.");
            }
            finally
            {
                this.fecharConexao();
            }
        }

        public Reserva consultarPorId(string id)
        {
            Reserva reservaMetodo = null;

            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT ID_RESERVA, DATA, HORARIO, DURACAO, QUANTIDADE_JOGADORES, ID_CAMPO FROM RESERVA WHERE RESERVA.ID_RESERVA =" + Convert.ToInt32(id), this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                if (DbReader.Read())
                {
                    reservaMetodo = new Reserva();
                    reservaMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_RESERVA")));
                    reservaMetodo.Data = DbReader.GetString(DbReader.GetOrdinal("DATA"));
                    reservaMetodo.Horario = DbReader.GetString(DbReader.GetOrdinal("HORARIO"));
                    reservaMetodo.Duracao = DbReader.GetString(DbReader.GetOrdinal("DURACAO"));
                    reservaMetodo.QuantidadeJogadores = DbReader.GetString(DbReader.GetOrdinal("QUANTIDADE_JOGADORES"));
                    reservaMetodo.Campo = new Campo();

                    if (DbReader.IsDBNull(DbReader.GetOrdinal("ID_CAMPO")))
                    {
                        reservaMetodo.Campo.Id = "REMOVIDO";
                    }
                    else
                    {
                        reservaMetodo.Campo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_CAMPO")));
                    }
                }

                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao consultar o Reserva.");
            }

            finally
            {
                this.fecharConexao();
            }
            return reservaMetodo;
        }

        public List<Reserva> listar()
        {
            List<Reserva> listaReserva = new List<Reserva>();

            try
            {
                this.abrirConexao();
                SqlCommand comando = new SqlCommand("SELECT ID_RESERVA, DATA, HORARIO, DURACAO, QUANTIDADE_JOGADORES, ID_CAMPO FROM RESERVA", this.conexao);
                SqlDataReader DbReader = comando.ExecuteReader();
                while (DbReader.Read())
                {
                    Reserva reservaMetodo = new Reserva();
                    reservaMetodo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_RESERVA")));
                    reservaMetodo.Data = DbReader.GetString(DbReader.GetOrdinal("DATA"));
                    reservaMetodo.Horario = DbReader.GetString(DbReader.GetOrdinal("HORARIO"));
                    reservaMetodo.Duracao = DbReader.GetString(DbReader.GetOrdinal("DURACAO"));
                    reservaMetodo.QuantidadeJogadores = DbReader.GetString(DbReader.GetOrdinal("QUANTIDADE_JOGADORES"));
                    reservaMetodo.Campo = new Campo();
                    
                    if (DbReader.IsDBNull(DbReader.GetOrdinal("ID_CAMPO")))
                    {
                        reservaMetodo.Campo.Id = "REMOVIDO";
                    }
                    else
                    {
                        reservaMetodo.Campo.Id = Convert.ToString(DbReader.GetInt32(DbReader.GetOrdinal("ID_CAMPO")));
                    }

                    listaReserva.Add(reservaMetodo);
                }

                DbReader.Close();
                comando.Dispose();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message + " Erro ao listar o Reserva.");
            }

            finally
            {
                this.fecharConexao();
            }
            return listaReserva;
        }
    }
}
